<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 有n个数组,每个数组中取一个,有多少中排列组合 js
        var obj = {
            1: {
                from: [2, 4],
                to: [5, 6]
            },
            2: {
                from: [7, 7],
                to: [9, 10]
            },
        }

        /* 
            封装方法：统计一个区间之间按照指定宽度的一连串递增的数据
            @arrData {Array} 一个数组，只能有两个值，表示从一个值到另一个值。
            @Incremental {Number} 宽度，区间会按照该宽度进行地递增
        */
        function IncrementalFn(arrData, Incremental) {
            if (!Incremental || Incremental == 0) return;
            Incremental = Math.abs(Incremental)
            if (arrData[0] > arrData[1]) [arrData[0], arrData[1]] = [arrData[1], arrData[0]];
            var aArr = [];
            for (let index = Number(arrData[0]); index <= Number(arrData[1]);) {
                aArr.push(index);
                index = index + Incremental;
            }
            return aArr;
        }

        // var tt1 = IncrementalFn([2, 5], 1)
        // console.log(tt1);
        // tt2 = IncrementalFn([7, 2], 1)
        // console.log(tt2);
        // console.log(combinationFn([tt1, tt2]));





        /* 
            封装方法：设置有n个数组，每个数组中都有数据，现有需求：按照顺序从每一数组中取出一个元素，并按照取出元素的顺序添加到一个新的数组中，求有多少种组合
            ==注意==：必须要每个数组中都有数据，否则最终的返回结果是空数组。
            @doubleArrData {Array} 这是一个二维数组
        */
        function combinationFn(doubleArrData) {
            var total = [];
            (function d(arr, index_ = 0, tep = []) {
                for (let index = index_; index < arr.length; index++) {
                    const element = arr[index];

                    if (index != 0 && tep.length !== index) continue;

                    for (let index2 = 0; index2 < element.length; index2++) {
                        const element2 = element[index2];

                        tepClone = JSON.parse(JSON.stringify(tep));
                        tepClone.push(element2);
                        if (index < arr.length - 1) {
                            d(arr, index + 1, tepClone);
                        } else {
                            total.push(tepClone);
                        }
                    }
                }
            })(doubleArrData)
            return total;
        }

        /* 
            另一种解决方法,也不能有空数组   https://blog.csdn.net/baidu_32519511/article/details/82980032
        */
        textArr = [
            ['a', 'b', 'c'],
            ['d', 'e', 'f', 'g'],
            ['h', 'i']
        ]
        getCombination = (array) => {
            let resultArry = [];
            array.forEach((arrItem) => {
                if (resultArry.length === 0) {
                    resultArry = arrItem
                } else {
                    const emptyArray = [];
                    resultArry.forEach((item) => {
                        arrItem.forEach((value) => {
                            emptyArray.push([...item, value])
                        })
                    })
                    resultArry = emptyArray
                }
            });
            return resultArry;
        }
        // console.log(getCombination(textArr))

        // total =  combinationFn([
        //     [
        //         [1, 1],
        //         [2, 2]
        //     ],
        //     [
        //         [3, 3],
        //         [4, 4]
        //     ],
        //     [
        //         [5, 5],
        //         [6, 6],
        //         [7, 7],
        //     ]
        // ])
        // total = combinationFn([
        //     [
        //         [1, 1],
        //         [2, 2]
        //     ],
        //     [
        //         [3, 3],
        //         [4, 4]
        //     ]
        // ])
        // total = combinationFn([
        //     [
        //         1, 2, 3, 4, 5, 6
        //     ],
        //     [
        //         11, 22, 33, 44, 55, 66, 77, 88
        //     ],
        //     ['a', 'b', 'c', 'd']
        // ])
        total = combinationFn([
            [
                1, 2
            ],
            [],
            ['a']
        ])
        // console.log('', total)


        // https://zhidao.baidu.com/question/1243895618553928059.html
        // N个数组,从每个数组中取出1个 求所有的组合 js


        function test() {
            var a = ['12', '233', '313', 'd', '-0']
            console.log('a=== ', a)
            var b = a.reduce(function (acc, item, index, arr) {
                // var ccc = index == 1 ? (tt = [], tt.push(Number(acc)), tt.push(Number(item)), tt) : (acc.push(Number(item)), acc)
                return index == 1 ? (tt = [], tt.push(Number(acc)), tt.push(), tt) : (acc.push(Number(item)), acc)
            })
            console.log('b', b)
        }
        // test()

        function test2() {
            console.log('arguments', arguments)
            var arguments = arguments.reduce((acc, item) => (acc.push(Number(item)), acc), [])
            console.log('b', arguments)
        }
        test2()

        // for (let index = 0; index < arguments.length; index++) {
        //     arguments[index] = Number(arguments[index])
        // }

    </script>
</body>

</html>